package com.zhixi.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
import java.util.concurrent.ThreadPoolExecutor;
 
/**
 * @ClassName ThreadPoolTaskConfig
 * @Author zhangzhixi
 * @Description 线程池配置类
 * @Date 2022-3-29 19:53
 * @Version 1.0
 */
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
 
    private static final Logger logger = LoggerFactory.getLogger(ThreadPoolTaskConfig.class);
 
    @Value("${async.executor.thread.core_pool_size}")
    private int corePoolSize;
 
    @Value("${async.executor.thread.max_pool_size}")
    private int maxPoolSize;
 
    @Value("${async.executor.thread.queue_capacity}")
    private int queueCapacity;
 
    @Value("${async.executor.thread.name.prefix}")
    private String namePrefix;
 
    @Bean(name = "taskExecutor")
    public ThreadPoolTaskExecutor asyncServiceExecutor() {
 
        logger.info("start asyncServiceExecutor");
 
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(corePoolSize);
        //配置最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        //配置队列大小
        executor.setQueueCapacity(queueCapacity);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix(namePrefix);
 
        // rejection-policy：当pool已经达到max size的时候，如何处理新任务
        // 拒绝策略：CALLER_RUNS：不在新线程中执行任务，而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
 
        //执行初始化
        executor.initialize();
        return executor;
    }
}